package Thread_.homework;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;

/**
 * 使用Executors 创建常见的线程池(线程数量固定的线程池)
 *通过构造方法, 创建指定数量的线程, 将线程都创建好,并启动
 *提供一个阻塞队列,存放新的任务
 *提供submit方法,将新的任务 放到队列中
 */
class MyExecutors{
    private BlockingQueue<Runnable> queue=new ArrayBlockingQueue<>(100);
    public MyExecutors(int n){//N:线程池中线程数量
        for(int i=0;i<n;i++){
            new Thread(()->{
                while(true){//线程频繁扫描队列,扫描到一个,就执行一个,并将去从队列中删除
                    try {
                        //该队列带有阻塞功能,若队列为空,会自动阻塞等待
                        queue.take().run();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }).start();
        }
    }
    public void submit(Runnable runnable) throws InterruptedException {
        queue.put(runnable);
    }
}
public class test17 {
    public static void main(String[] args) throws InterruptedException {
        MyExecutors myExecutors = new MyExecutors(5);
        for(int i=0;i<100;i++){
            int n=i;
            myExecutors.submit(()->{
                System.out.println("线程为: "+ n + " ,线程名: "+Thread.currentThread().getName());
            });
        }
    }
}
